package com.tzy.rabbitmq.helloworld;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
 * 消费者
 */
public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        //构建一个工厂
        final ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置主机信息
//        connectionFactory.setHost("172.21.83.16");
//        connectionFactory.setHost("localhost");
//        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setHost("169.254.246.87");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("123456");
        Connection connection = connectionFactory.newConnection();
        //获取TCP长连接
//        final Connection connection = RabbitmqUtil.getConnection();
        //创建TCP通道,相当于TCP中的虚拟连接
        Channel channel = connection.createChannel();
        //创建队列，声明并创建一个队列，如果队列已存在，则使用这个队列
        //第一个参数:队列名称ID
        //第个参数: 是否持久化 durable:持久化， false对应不持久化数据，MQ停掉数据就会丢失
        //第三个参数:是否队列私有化，false则代表所有消费者都可以访问，true代表只有第次拥有它的消费者才能一直使用
        //第四个:是否自动删除，false代表连接停掉后不自动删除掉这个队列
        //其他额外的参数，null
        channel.queueDeclare("helloWorld",false,false,false,null);
        //从MQ服务器中获取数据
        //创建一个消息消费者
        //第一个参数代表队列名
        //第二个参数代表是否自动确认收到消息，false代表 手动编程来确认消息，这是MQ的推荐做法
        //第三个参数要传入DefaultConsumer的实现类
        channel.basicConsume("helloWorld",false, new Receiver(channel));

    }
}
    /**
     * 接收器，收件人
     */
    class Receiver extends DefaultConsumer {
        private Channel channel;
        public Receiver(Channel channel) {
            super(channel);
            this.channel = channel;
        }
        /**
         *
         * @param consumerTag 消费者标签
         * @param envelope 信封
         * @param properties 属性
         * @param body 正
         * @throws IOException
         */
        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            final String message = new String(body);
            System.out.println("消费者接收到的消息:"+message);
            System.out.println("消息的TagId:"+envelope.getDeliveryTag());
            //false只确认签收当前的消息, 设置为true的时候则代表签收该消费者所有未签收的消总
            channel.basicAck(envelope.getDeliveryTag(),false);
        }
    }

